/* 
 * File:   ModeloEstructurado.h
 * Author: Marce
 *
 * Created on 7 de junio de 2012
 */
 
class ModeloEstructurado {
		
	protected:
		uInt 						blocksize;
		unsigned short 				IDnivelActual;
		vector<Nivel*>				niveles;
		static const unsigned short cantidadNiveles = 9;
	
		const char* 	inputFilename;
		const char* 	outputFilename;
		
		bool 			readingFromFile;
		
		void* getNivelActual();
		void crearNiveles();
		
	public:
	
		void setInputFilename(const char*);
		void setOutputFilename(const char*);
		
		bool debug;
		
};

class ModeloEstructuradoCompress : public ModeloEstructurado {
	
	private:
		
		ifstream 			inputFile;
		OCompressedStream*	outputFile;
		bool				imAtFirstBlock;
		
	protected:
	
		int getNextBlockOfText(char** text);
		void comprimirChar (char c, bool isEof );
	
	public:
	
		ModeloEstructuradoCompress();
		ModeloEstructuradoCompress(const char* inputFilename, uInt blockSize);
		~ModeloEstructuradoCompress();
			
		// Comprime un bloque del archivo de entrada y
		// guarda el resultado en el archivo de output
		int runNextBlock(vector<string>* output);
		
		// Comprime un string (parametro) y devuelve
		// el resultado en el vector
		int runBlock(const string input, vector<string>* output) ;
		
		// Comprime un archivo de entrada y devuelve
		// un archivo de salida
		int run();
	
};

class ModeloEstructuradoDecompress : public ModeloEstructurado {
	
	private:
		
		OCompressedStream*	inputFile;
		ofstream			outputFile;
		
		void decompressString(const string* input);
		
	public:
	
		ModeloEstructuradoDecompress();
		ModeloEstructuradoDecompress(const char* inputFilename, uInt blockSize);
		~ModeloEstructuradoDecompress();
			
		// "Descomprime" un bloque del archivo de entrada y
		// guarda el resultado en el parametro
		int runNextBlock( string* textoDescomprimido );
		
		// "Descomprime" un bloque comprimido con ModeloEstructurado
		int runBlock(const char* textoComprimido, string* textoDescomprimido);
		
		// "Descomprime" todo un archivo
		int run();
};
